package ar.com.wholeconsulting.pacc.model;

import java.io.Serializable;
import java.util.LinkedList;
import java.util.List;

import javax.persistence.CascadeType;
import javax.persistence.Column;
import javax.persistence.Entity;
import javax.persistence.GeneratedValue;
import javax.persistence.GenerationType;
import javax.persistence.Id;
import javax.persistence.JoinColumn;
import javax.persistence.JoinTable;
import javax.persistence.ManyToOne;
import javax.persistence.OneToMany;
import javax.persistence.OneToOne;
import javax.persistence.Table;

import ar.com.wholeconsulting.pacc.model.ensayos.Ensayo;
import javax.persistence.*;

/**
 * @version 1.0 @created 06-Dic-2011 21:12:39
 */
@Entity
@Table(name = "APARATOS")
@NamedQueries({
    @NamedQuery(name = "Aparato.findByUsuario", query = "from Aparato a WHERE a.usuario = ?0"),
    @NamedQuery(name = "Aparato.findByID", query = "from Aparato a WHERE a.id = ?0"),
    @NamedQuery(name = "Aparato.findAll", query = "FROM Aparato a")})
public class Aparato implements Serializable {

    /**
     *
     */
    private static final long serialVersionUID = -3397098004434337199L;
    @Id
    @GeneratedValue(strategy = GenerationType.AUTO)
    @Column(name = "APARATO_ID")
    private Long id;
    @ManyToOne
    @JoinColumn(name = "USUARIO_ID")
    private Usuario usuario;
    @OneToOne(cascade = CascadeType.ALL)
    @JoinColumn(name = "MODELO_ID", unique = true, nullable = false)
    private Modelo modelo;
    @OneToMany(cascade = CascadeType.ALL)
    @JoinTable(name = "AparatoPeriferico", joinColumns = {
        @JoinColumn(name = "APARATO_ID")}, inverseJoinColumns = {
        @JoinColumn(name = "PERIFERICO_ID")})
    private final List<Periferico> perifericos;
    @OneToMany(cascade = CascadeType.ALL)
    @JoinTable(name = "AparatoEnsayo", joinColumns = {
        @JoinColumn(name = "APARATO_ID")}, inverseJoinColumns = {
        @JoinColumn(name = "ENSAYO_ID")})
    private final List<Ensayo> ensayos;
    private String descripcion;
    @Column(name = "nro_serie", unique = true, nullable = false)
    private String numeroDeSerie;
    private Disposicion disposicion;

    /*
     * TIPO/FABRICATE/FLUIDO CONTENIDO
     */
    public Aparato() {
        this.ensayos = new LinkedList<Ensayo>();
        this.perifericos = new LinkedList<Periferico>();
    }

    public void addPeriferico(Periferico periferico) {
        this.perifericos.add(periferico);
    }

    public void addEnsayo(Ensayo ensayo) {
        this.ensayos.add(ensayo);
    }

    public List<Periferico> getPerifericos() {
        // TODO immutarlo
        return this.perifericos;
    }

    public List<Ensayo> getEnsayos() {
        // TODO immutarlo
        return this.ensayos;
    }

    public Modelo getModelo() {
        return this.modelo;
    }

    public void setModelo(Modelo modelo) {
        this.modelo = modelo;
    }

    public Usuario getUsuario() {
        return this.usuario;
    }

    public void setUsuario(Usuario usuario) {
        this.usuario = usuario;
    }

    public Long getId() {
        return this.id;
    }

    public void setId(Long id) {
        this.id = id;
    }

    public String getDescripcion() {
        return this.descripcion;
    }

    public void setDescripcion(String descripcion) {
        this.descripcion = descripcion;
    }

    public Disposicion getDisposicion() {
        return this.disposicion;
    }

    public void setDisposicion(Disposicion disposicion) {
        this.disposicion = disposicion;
    }

    public String getNumeroDeSerie() {
        return this.numeroDeSerie;
    }

    public void setNumeroDeSerie(String numeroDeSerie) {
        this.numeroDeSerie = numeroDeSerie;
    }
    static public String FIND_BY_NOMBRE = "Aparato.findByUsuario";
    static public String FIND_BY_ID = "Aparato.findByID";
    static public String FIND_ALL = "Aparato.findAll";
}
